
#ifndef __MAIN_H
#define __MAIN_H

//#define _SECURE_SCL 0
//#define _HAS_ITERATOR_DEBUGGING 0

//#define USE_EIGEN

//
// C/C++ includes
//
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <stdarg.h>

#ifdef WIN32
    #include <windows.h>
#endif

#include <cassert>
#include <vector>
#include <unordered_map>
#include <iostream>
#include <algorithm>
#include <string>
#include <fstream>
#include <sstream>
#include <queue>
#include <deque>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <limits>

//
// External libraries
//
#ifdef WIN32
    #include "freeglut/freeglut.h"
    #include "libpng/png.h"
#else
    #include "libpng12/png.h"
    #include "GLUT/glut.h"
#endif

using namespace std;

//
// Core
//
#include "core/assert.h"
#include "core/types.h"
#include "core/constants.h"

//
// Math
//
#include "math/math.h"
#include "math/Vec2i.h"
#include "math/Graph.h"

//
// Eigen linear algebra library
//
#ifdef USE_EIGEN
#include "Eigen/Dense"
#endif

//
// Utility
//
#include "utility/utility.h"
#include "utility/stringHelper.h"
#include "utility/RGBColor.h"
#include "utility/InputDataStream.h"
#include "utility/OutputDataStream.h"
#include "utility/grid.h"
#include "utility/bitmap.h"
#include "utility/GLTexture.h"
#include "utility/directory.h"
#include "utility/composeStream.h"
#include "utility/parameterFile.h"
#include "utility/time.h"
#include "utility/glTextConsole.h"
#include "utility/matrixWriter.h"

//
// Math
//
#include "math/DenseMatrix.h"
#include "math/linearRegression.h"
#include "math/SparseIntVector.h"
#include "math/SparseDoubleVector.h"

//
// Supervised learning
//
#include "supervised/binaryClassifier.h"
#include "supervised/decisionTree.h"

//
// Game
//
#include "game/controllerState.h"
#include "game/spriteCollection.h"
#include "game/frame.h"
#include "game/frameGrid.h"
#include "game/game.h"
#include "game/replay.h"
#include "game/replayCollection.h"
#include "game/neighborhood.h"
#include "game/neighborhoodFeatureSet.h"
#include "game/neighborhoodCollection.h"

//
// Learning
//
#include "learning/gameAgent.h"
#include "learning/learningMacros.h"
#include "learning/featureTransform.h"
#include "learning/TcFeatureTransform.h"
#include "learning/gameModelFrame.h"
#include "learning/modelLearner.h"
#include "learning/gameModel.h"
#include "learning/gameModelEvaluator.h"
#include "learning/valueFunction.h"
#include "learning/valueIterationLearner.h"
#include "learning/randomGameAgent.h"
#include "learning/alwaysPerformSingleActionGameAgent.h"
#include "learning/SarsaLearner.h"
#include "learning/SarsaCoordinator.h"

//
// Game List
//
#include "gameList/testBasic/gameTestBasic.h"
#include "gameList/snake/gameSnake.h"
#include "gameList/missileSwarm/gameMissileSwarm.h"
#include "gameList/snakeBasic/gameSnakeBasic.h"
#include "gameList/snakeOnline/snakeOnline.h"
#include "gameList/tetrisBasic/gameTetrisBasic.h"
#include "gamelist/breakout/gameBreakout.h"
#include "gamelist/gridWorld/gameGridWorld.h"
#include "gamelist/fruitEater/gameFruitEater.h"
#include "gamelist/frogger/gameFrogger.h"
#include "gamelist/dodgeTheMissile/gameDodgeTheMissile.h"
#include "gamelist/pong/gamePong.h"
#include "gamelist/ddr/gameDDR.h"

//
// Application
//
#include "core/appParameters.h"
#include "core/application.h"

#endif